# frozen_string_literal: true

DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::SEND_PMS) do
  version 1

  placeholder :sender_username
  placeholder :receiver_username

  field :sender, component: :user
  field :receiver, component: :user, triggerable: :recurring
  field :sendable_pms, component: :pms, accepts_placeholders: true, required: true

  triggerables %i[
                 user_badge_granted
                 user_added_to_group
                 stalled_wiki
                 recurring
                 user_promoted
                 api_call
                 user_removed_from_group
               ]

  script do |context, fields, automation|
    sender_username = fields.dig("sender", "value") || Discourse.system_user.username

    placeholders = { sender_username: sender_username }.merge(context["placeholders"] || {})

    usernames = context["usernames"] || []

    # optional field when using recurring triggerable
    if u = fields.dig("receiver", "value")
      usernames << u
    end

    usernames.compact.uniq.each do |username|
      placeholders[:receiver_username] = username
      Array(fields.dig("sendable_pms", "value")).each do |sendable|
        next if !sendable["title"] || !sendable["raw"]

        pm = {}
        pm["title"] = utils.apply_placeholders(sendable["title"], placeholders)
        pm["raw"] = utils.apply_placeholders(sendable["raw"], placeholders)
        pm["target_usernames"] = Array(username)

        utils.send_pm(
          pm,
          sender: sender_username,
          automation_id: automation.id,
          delay: sendable["delay"],
          prefers_encrypt: !!sendable["prefers_encrypt"],
        )
      end
    end
  end
end
